package com.houweishi.module.bizSerialNum.service.impl;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

import com.houweishi.common.constant.Constants;
import com.houweishi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.houweishi.module.bizSerialNum.mapper.BizSerialNumTMapper;
import com.houweishi.module.bizSerialNum.domain.BizSerialNumT;
import com.houweishi.module.bizSerialNum.service.IBizSerialNumTService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;

/**
 * 表单流水生成表Service业务层处理
 * 
 * @author houweishi
 * @date 2023-03-09
 */
@Service
public class BizSerialNumTServiceImpl implements IBizSerialNumTService 
{
    @Resource
    private BizSerialNumTMapper bizSerialNumTMapper;

    /**
     * 查询表单流水生成表
     * 
     * @param id 表单流水生成表主键
     * @return 表单流水生成表
     */
    @Override
    public BizSerialNumT selectBizSerialNumTById(Long id)
    {
        return bizSerialNumTMapper.selectBizSerialNumTById(id);
    }

    /**
     * 查询表单流水生成表列表
     * 
     * @param bizSerialNumT 表单流水生成表
     * @return 表单流水生成表
     */
    @Override
    public List<BizSerialNumT> selectBizSerialNumTList(BizSerialNumT bizSerialNumT)
    {
        return bizSerialNumTMapper.selectBizSerialNumTList(bizSerialNumT);
    }

    /**
     * 查询表单流水生成
     *
     * @param bizSerialNumT 表单流水生成表
     * @return 表单流水生成表
     */
    public BizSerialNumT selectBizSerialNumT(BizSerialNumT bizSerialNumT)
    {
        BizSerialNumT bizSerialNum=null;
        List<BizSerialNumT> bizSerialNumTS = bizSerialNumTMapper.selectBizSerialNumTList(bizSerialNumT);
        if (!CollectionUtils.isEmpty(bizSerialNumTS)){
            bizSerialNum = bizSerialNumTS.get(0);
        }
        return bizSerialNum;
    }

    /**
     * 新增表单流水生成表
     * 
     * @param bizSerialNumT 表单流水生成表
     * @return 结果
     */
    @Override
    public int insertBizSerialNumT(BizSerialNumT bizSerialNumT)
    {
        bizSerialNumT.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
        bizSerialNumT.setUpdateTime(DateUtils.parseDate(DateUtils.getTime()));
        bizSerialNumT.setCreateBy("system");
        bizSerialNumT.setUpdateBy("system");
        return bizSerialNumTMapper.insertBizSerialNumT(bizSerialNumT);
    }

    /**
     * 修改表单流水生成表
     * 
     * @param bizSerialNumT 表单流水生成表
     * @return 结果
     */
    @Override
    public int updateBizSerialNumT(BizSerialNumT bizSerialNumT)
    {
        bizSerialNumT.setUpdateTime(DateUtils.parseDate(DateUtils.getTime()));
        return bizSerialNumTMapper.updateBizSerialNumT(bizSerialNumT);
    }

    /**
     * 批量删除表单流水生成表
     * 
     * @param ids 需要删除的表单流水生成表主键
     * @return 结果
     */
    @Override
    public int deleteBizSerialNumTByIds(Long[] ids)
    {
        return bizSerialNumTMapper.deleteBizSerialNumTByIds(ids);
    }

    /**
     * 删除表单流水生成表信息
     * 
     * @param id 表单流水生成表主键
     * @return 结果
     */
    @Override
    public int deleteBizSerialNumTById(Long id)
    {
        return bizSerialNumTMapper.deleteBizSerialNumTById(id);
    }

    /**
     * 生成流水单号
     * @param processType
     * @return
     */
    @Override
    public  String generateSerialNum(String processType) {
        return createSerialNum(processType);
    }

    /**
     * 生成流水单号
     * @param processType
     * @return
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED)
    public synchronized String createSerialNum(String processType) {
        //当天日期
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate formatDate = LocalDate.now();
        String dateStr = formatDate.format(df);
        String processDate =dateStr.replaceAll("-", "").substring(2);
        System.out.println("生成流水单号的日期："+processDate);

        Integer serial;
        BizSerialNumT bizSerialNumT = new BizSerialNumT();
        bizSerialNumT.setDataState("1");
        bizSerialNumT.setProcessType(processType);
        bizSerialNumT.setProcessDate(processDate);
        //获取流水表单类型记录
        BizSerialNumT serialNum = selectBizSerialNumT(bizSerialNumT);
        if (null == serialNum) {
            System.out.println("生成流水单号的新增");
            serial = 1;
            bizSerialNumTMapper.insertBizSerialNumT(new BizSerialNumT(processType, processDate, serial, Constants.DATA_VALID_STATE));
        } else {
            serial = serialNum.getSerial() + 1;
            serialNum.setSerial(serial);
            System.out.println("生成流水单号的修改"+serial);
            bizSerialNumTMapper.updateBizSerialNumT(serialNum);
        }
        String serialTmp = String.valueOf(serial);
        if (serial < (Math.pow(10, 4))) {
            serialTmp = String.format("%0" + 4 + "d", serial);
        }
        System.out.println("生成流水单号的完整单号："+serialTmp);
        return new StringBuilder(processType).append(processDate).append(serialTmp).toString();
    }

}
